package org.example.cloud.api;

import org.example.cloud.entities.dto.PayDTO;
import org.example.cloud.util.ResultData;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * @author 宋孟林
 * @description 在公共api模块中声明支付api所有微服务消费者直接从公用api调用即可，
 * 不必些restTemplate中的各种返回方式和返回类型，大大简化了开发。使用这个api直接自动注入payFeignApi对象。使用起来相当方便
 * @date: 2025/4/7 9:10
 */
//这个下面的注解的value的值是唯一的，不能在另外一个FeignClient中再次注册
//@FeignClient(value = "cloud-payment-service-provider") //一定要加上value，因为要表达这些请求会向哪些微服务模块发送请求
@FeignClient(value = "cloud-gateway")
public interface PayFeignApi {
    @PostMapping("/pay/add")
    ResultData<String> addPay(@RequestBody PayDTO payDTO);
    @DeleteMapping("/pay/del/{id}")
    ResultData<Integer> deletePay(@PathVariable("id") Integer id);
    @PutMapping("/pay/update")
    ResultData<String> updatePay(@RequestBody PayDTO payDTO);
//    @GetMapping("/pay/get/{id}")
//    ResultData<?> getById(@PathVariable("id") Integer id);
    @GetMapping("/pay/getAll")
    ResultData<List<PayDTO>> selectAll();
    /**
     * Resilience4j CircuitBreaker 的例子
     * @param id id
     * @return string
     */
    @GetMapping(value = "/pay/circuit/{id}")
    String myCircuit(@PathVariable("id") Integer id);
    @GetMapping(value = "/pay/bulkhead/thread/{id}")
    CompletableFuture<String> myBulkhead(@PathVariable("id") Integer id);

    @GetMapping(value = "/pay/ratelimit/{id}")
    String myRatelimit(@PathVariable("id") Integer id);

    @GetMapping(value = "/pay/micrometer/{id}")
    String myMicrometer(@PathVariable("id") Integer id);

    @GetMapping(value = "/pay/gateway/get/{id}")
    ResultData<?> getById(@PathVariable("id") Integer id);

    @GetMapping(value = "/pay/gateway/info")
    ResultData<String> getGatewayInfo();
}
